home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok41
/
spiele
/
mastermind
/
txt
/
mastermind.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
11KB
|
395 lines
(*********************************************************************
*
* :Program. Mastermind
* :Author. Hans Schafft
* :Address. Landfriedstraße 1A - Hinterhaus
* :Address. 6900 Heidelberg
* :Phone. 06221 - 22416
* :Version. 1.3
* :Date. 22.6.1990
* :Copyright. PD
* :Language. Modula-II
* :Translator. M2Amiga
*
*********************************************************************)
MODULE Mastermind;
FROM Abbruch IMPORT ZeigeAbbruch;
FROM MODUS IMPORT Modus;
FROM WARNUNG IMPORT DruckerAn;
FROM BESTENLISTE IMPORT BestenListe;
FROM BildMalen IMPORT Malen;
FROM SCREEN IMPORT FensterAuf,ScreenAuf;
FROM VonWem IMPORT ShowReq;
FROM Gadget IMPORT gadNum, FestGadgetAufbau, TipFuellen,
Auswerten,StellenUndFarben,
GadgetsLoeschen, FlexGadgetAufbau;
FROM Graphics IMPORT SetAPen,RectFill,GetRGB4,SetRGB4,SetRast,jam1;
FROM Intuition IMPORT GadgetPtr, CloseWindow, WindowPtr, CurrentTime,
CloseScreen, ScreenPtr, keyCodeQ, IntuiText,
RemoveGadget, selectDown, ScreenToFront,
GetPrefs,SetPrefs,Preferences,
IntuiMessagePtr, IDCMPFlags, IDCMPFlagSet;
FROM Exec IMPORT MemReqs, MemReqSet, WaitPort, ReplyMsg, GetMsg;
FROM Arts IMPORT AllLevelTermProc, Assert, Requester, Terminate;
FROM RandomNumber IMPORT RND, PutSeed;
FROM SYSTEM IMPORT ADDRESS, LONGSET, ADR;
FROM ASCII IMPORT ht,cr,lf;
FROM FileSystem IMPORT Lookup,Close,Response,File,WriteChar,WriteBytes;
FROM FileMessage IMPORT ResponseText,StrPtr;
VAR x,stellenAnzahl : INTEGER;
y,farbAnzahl,YPos : INTEGER;
zufallsKombination : ARRAY [1..15] OF INTEGER;
rateVersuch : ARRAY [1..15] OF INTEGER;
wiPtr : WindowPtr;
scPtr : ScreenPtr;
sfrgb : ARRAY [16..19],[1..3] OF CARDINAL;
aktuelleFarbe : LONGINT;
drucken,modus : BOOLEAN;
dr : File;
prefs : Preferences;
CONST OK = 15;
HILFE = 16;
(***************************************************************)
PROCEDURE DruckerAusgabe(ja : BOOLEAN);
VAR strPtr : StrPtr;
BEGIN
IF ja THEN
drucken := DruckerAn(wiPtr);
IF drucken THEN
Lookup(dr,"PRT:",0,FALSE);
ResponseText(dr.res,strPtr);
Assert(dr.res = done,strPtr);
END;
ELSE
IF drucken THEN
Close(dr);
END;
END;
END DruckerAusgabe;
(***************************************************************)
PROCEDURE ErstelleZufallsKombination;
VAR s,m : LONGINT;
y,test : INTEGER;
wh,einfach : BOOLEAN;
BEGIN
IF stellenAnzahl > farbAnzahl THEN
einfach := FALSE;
ELSE
einfach := Modus(wiPtr);
END;
IF einfach THEN
FOR y := 1 TO stellenAnzahl DO
rateVersuch[y] := y;
END;
ELSE
FOR y := 1 TO stellenAnzahl DO
rateVersuch[y] := 1;
END;
END;
CurrentTime(ADR(s),ADR(m));
PutSeed(m);
zufallsKombination[1] := RND(farbAnzahl)+1;
FOR x := 2 TO stellenAnzahl DO
IF einfach THEN
wh := TRUE;
WHILE wh DO
test := RND(farbAnzahl)+1;
wh := FALSE;
FOR y := 1 TO x-1 DO
IF zufallsKombination[y] = test THEN
wh := TRUE;
END;
END;
END;
zufallsKombination[x] := test;
ELSE
zufallsKombination[x] := RND(farbAnzahl)+1;
END;
END;
END ErstelleZufallsKombination;
(***************************************************************)
PROCEDURE AusDruck(fs,nf : INTEGER);
VAR actual : LONGINT;
BEGIN
IF drucken THEN
IF fs = HILFE THEN
WriteBytes(dr,ADR("Das waren "),10,actual);
IF nf < 10 THEN
WriteChar(dr,CHAR(48+nf));
ELSE
WriteChar(dr,"1");
WriteChar(dr,CHAR(38+nf));
END;
WriteBytes(dr,ADR(" Hilfen !!"),10,actual);
WriteChar(dr,cr);
WriteChar(dr,lf);
ELSE
FOR x := 1 TO stellenAnzahl DO
WriteChar(dr,CHAR(rateVersuch[x]+64));
WriteChar(dr," ");
END;
WriteChar(dr,ht);
WriteChar(dr,CHAR(fs+48));
WriteChar(dr,ht);
WriteChar(dr,CHAR(nf+48));
WriteChar(dr,cr);
WriteChar(dr,lf);
END;
END;
END AusDruck;
(***************************************************************)
PROCEDURE TipAuswerten() : BOOLEAN;
VAR rv,zk : ARRAY [1..15] OF INTEGER;
x,y,farbeUndStelle,nurFarbe : INTEGER;
BEGIN
FOR x := 1 TO 15 DO
rv[x] := rateVersuch[x];
zk[x] := zufallsKombination[x];
END;
farbeUndStelle := 0;
nurFarbe := 0;
FOR x := 1 TO stellenAnzahl DO
IF rv[x] = zk[x] THEN
INC(farbeUndStelle);
rv[x] := -1;
zk[x] := -1;
END;
END;
IF farbeUndStelle = stellenAnzahl THEN
Auswerten(farbeUndStelle,OK);
AusDruck(farbeUndStelle,nurFarbe);
RETURN TRUE;
ELSE
FOR x := 1 TO stellenAnzahl DO
FOR y := 1 TO stellenAnzahl DO
IF (rv[x] = zk[y]) AND (rv[x] # -1) THEN
INC(nurFarbe);
rv[x] := -1;
zk[y] := -1;
END;
END;
END;
Auswerten(farbeUndStelle,nurFarbe);
AusDruck(farbeUndStelle,nurFarbe);
RETURN FALSE;
END;
END TipAuswerten;
(***************************************************************)
PROCEDURE OrigPointerRetten;
VAR x,y : LONGINT;
lc : ARRAY [16..19] OF LONGCARD;
BEGIN
FOR x := 16 TO 19 DO
lc[x] := GetRGB4(scPtr^.viewPort.colorMap,x);
lc[x] := lc[x] DIV 16;
FOR y := 1 TO 3 DO
sfrgb[x,y] := lc[x] MOD 16;
lc[x] := lc[x] DIV 16;
END;
END;
END OrigPointerRetten;
(***************************************************************)
PROCEDURE FarbPointer;
VAR x,lc : LONGCARD;
r,g,b : CARDINAL;
BEGIN
lc := GetRGB4(scPtr^.viewPort.colorMap,aktuelleFarbe);
b := lc MOD 16; lc := lc DIV 16;
g := lc MOD 16; lc := lc DIV 16;
r := lc MOD 16;
FOR x := 16 TO 19 DO
SetRGB4(ADR(scPtr^.viewPort),x,r,g,b);
END;
END FarbPointer;
(***************************************************************)
PROCEDURE OrigPointer;
VAR x : CARDINAL;
BEGIN
FOR x := 16 TO 19 DO
SetRGB4(ADR(scPtr^.viewPort),x,sfrgb[x,1],sfrgb[x,2],sfrgb[x,3])
END;
END OrigPointer;
(***************************************************************)
PROCEDURE LosGehts() : BOOLEAN;
VAR
gadPtr : GadgetPtr;
gadNr,z : INTEGER;
hilfen,y : INTEGER;
versuche,x : INTEGER;
msgPtr : IntuiMessagePtr;
class : IDCMPFlagSet;
code : CARDINAL;
spielEnde,help : BOOLEAN;
BEGIN
spielEnde := FALSE;help := FALSE;
drucken := FALSE;
hilfen := 0;versuche := 0;
REPEAT
WaitPort(wiPtr^.userPort);
LOOP
msgPtr := GetMsg(wiPtr^.userPort);
IF msgPtr=NIL THEN EXIT END;
x := msgPtr^.mouseX;
y := msgPtr^.mouseY;
class := msgPtr^.class;
code := msgPtr^.code;
gadPtr := msgPtr^.iAddress;
gadNr := gadPtr^.gadgetID;
ReplyMsg(msgPtr);
IF (class = IDCMPFlagSet{gadgetUp}) THEN
IF NOT help AND (gadNr > 16) AND (gadNr < (17 + farbAnzahl)) THEN
aktuelleFarbe := LONGINT(gadNr - 16);
FarbPointer;
ELSIF (gadNr > 30) THEN
IF help THEN
OrigPointer;
TipFuellen(gadNr,zufallsKombination[gadNr-30]);
rateVersuch[gadNr-30] := zufallsKombination[gadNr-30];
INC(hilfen);
ELSE
TipFuellen(gadNr,CARDINAL(aktuelleFarbe));
rateVersuch[gadNr - 30] := aktuelleFarbe;
END;
END;
CASE gadNr OF
| INTEGER(ok) : IF NOT help THEN
INC(versuche);
FOR z := 31 TO stellenAnzahl+30 DO
TipFuellen(z,rateVersuch[z-30]);
END;
IF TipAuswerten() THEN
spielEnde := TRUE;
ELSE
spielEnde := FALSE;
END;
END;
| INTEGER(hilfe) : help := NOT help;
IF help THEN
SetRGB4(ADR(scPtr^.viewPort),0,0,0,8);
ELSE
Auswerten(HILFE,HILFE);
AusDruck(HILFE,hilfen);
SetRGB4(ADR(scPtr^.viewPort),0,0,0,0);
END;
| INTEGER(einaus): drucken := NOT drucken;
DruckerAusgabe(drucken);
| INTEGER(info) : ShowReq(wiPtr);
| INTEGER(neu) : SetRast(wiPtr^.rPort,0);
GadgetsLoeschen;
SetRGB4(ADR(scPtr^.viewPort),0,0,0,0);
RETURN FALSE;
| INTEGER(ende) : IF ZeigeAbbruch(wiPtr) THEN
Terminate(0);
END;
ELSE
END;
ELSIF NOT help AND (class = IDCMPFlagSet{mouseMove}) THEN
IF (x > 510) OR ((x > 400) AND (x < 450)) THEN
OrigPointer;
ELSE
FarbPointer;
END;
ELSIF (class = IDCMPFlagSet{rawKey}) AND (code = keyCodeQ) THEN
spielEnde := TRUE;
ELSE
END;
IF spielEnde THEN EXIT END;
END; (* LOOP *)
UNTIL spielEnde;
SetRGB4(ADR(scPtr^.viewPort),0,8,0,0);
Close(dr);
spielEnde := FALSE;
REPEAT
WaitPort(wiPtr^.userPort);
LOOP
msgPtr := GetMsg(wiPtr^.userPort);
IF msgPtr=NIL THEN EXIT END;
class := msgPtr^.class;
code := msgPtr^.code;
gadPtr := msgPtr^.iAddress;
gadNr := gadPtr^.gadgetID;
ReplyMsg(msgPtr);
IF (class = IDCMPFlagSet{gadgetUp}) THEN
CASE gadNr OF
| INTEGER(neu) : SetRast(wiPtr^.rPort,0);
GadgetsLoeschen;
SetRGB4(ADR(scPtr^.viewPort),0,0,0,0);
RETURN FALSE;
| INTEGER(info) : ShowReq(wiPtr);
| INTEGER(best) : SetRast(wiPtr^.rPort,0);
BestenListe(wiPtr,stellenAnzahl,farbAnzahl,
versuche,hilfen);
spielEnde := TRUE;
| INTEGER(ende) : IF ZeigeAbbruch(wiPtr) THEN
Terminate(0);
END;
ELSE
END;
ELSIF (class = IDCMPFlagSet{rawKey}) AND (code = keyCodeQ) THEN
help := FALSE;spielEnde := TRUE;
ELSE
END;
IF spielEnde THEN EXIT END;
END; (* LOOP *)
UNTIL spielEnde;
SetRast(wiPtr^.rPort,0);
GadgetsLoeschen;
SetRGB4(ADR(scPtr^.viewPort),0,0,0,0);
RETURN help;
END LosGehts;
(***************************************************************)
PROCEDURE AllesZu;
BEGIN
IF wiPtr # NIL THEN CloseWindow(wiPtr); END;
IF scPtr # NIL THEN CloseScreen(scPtr); END;
IF drucken THEN Close(dr); END;
END AllesZu;
(***************************************************************)
(***************************************************************)
BEGIN
wiPtr := NIL;scPtr := NIL;
AllLevelTermProc(AllesZu);
ScreenAuf(scPtr);
FensterAuf(scPtr,wiPtr);
OrigPointerRetten;
REPEAT
Malen(wiPtr);
FestGadgetAufbau(wiPtr);
OrigPointer;
stellenAnzahl := 8;
farbAnzahl := 8;
aktuelleFarbe := 1;
StellenUndFarben(stellenAnzahl,farbAnzahl);
FlexGadgetAufbau(stellenAnzahl);
ErstelleZufallsKombination;
UNTIL LosGehts();
END Mastermind.